﻿#include "datacontainerbase.h"
#include "../_global.h"

#ifdef _DEBUG
//#ifdef _CRTDBG_MAP_ALLOC
#define new new(_NORMAL_BLOCK, __FILE__, __LINE__)
//#endif 
#endif 


DataContainerBase::DataContainerBase(){
	setJoinEnable(1);
	fc=new SPtr<FileContainer>(SPTR_ALLOC_ON_CALL);
	//auto set ID
	setID(_global.incAndGetCurrentMaxID());
	flags=0;
}

DataContainerBase::DataContainerBase(__int64 _ID){
	setJoinEnable(1);
	fc=new SPtr<FileContainer>(SPTR_ALLOC_ON_CALL);
	setID(_ID);
	flags=0;
}

DataContainerBase::~DataContainerBase(){
	if(fc!=NULL){
    delete fc;
		fc=NULL;
	}
}

int DataContainerBase::preParse(SPtr<FileContainer> _inFileContainer,long _inOffsetInData, char **_outDataBuf, long *_outDataSize){

	setID(-1);

	if(_inFileContainer.isNULLPtr())return -1;
	if(_outDataSize==NULL)return -3;
	if(_outDataBuf==NULL)return -5;

	*_outDataSize=_inFileContainer.p()->getDataSize();
	*_outDataBuf=_inFileContainer.p()->getContainerData();
	if(_outDataBuf==NULL)return -4;
	if(*_outDataSize<0)return -2;
	if(*_outDataSize==0)return 0;
	//Размер данных до конца контейнера.
	//При этом он обычно больше
	//размера данных для этого контейнера (потомка этого клааса, парсящего свои данные). Реальный размер этого объекта
	//получается в процессе разбора данных и для каждого типа (например CT_USTRING) данных
	//разный
	*_outDataSize=*_outDataSize-_inOffsetInData;
	if(*_outDataSize<=0)return -1;
	*_outDataBuf=(*_outDataBuf+_inOffsetInData);
	return 1;//no errors and warnings

}

int DataContainerBase::preJoin(){

	fc->p()->setID(-1);

	//join не работает, если контейнер помечен как "только для чтения"
	if((fc->p()->getContainerFlags() & FC_FLAG_READ_ONLY)>0)return 0;
	//join disabled
	if((flags & 0x1)>0)return 0;

	return 1;//no errors and warnings

}

void DataContainerBase::setJoinEnable(int enable){
	if(enable>0)flags=flags | 0x1;
	else        flags=flags & 0xFFFFFFFE;
}

int	DataContainerBase::setFileContainer(SPtr<FileContainer> _fc){
	*fc=_fc;
  return 0;
}

SPtr<FileContainer> DataContainerBase::getFileContainer(){
	return *fc;
}